package ru.ifmo.rybakov.muclumon.analysis2;


public class RegressionModelPredictor {

//	private static class BasisComparator implements Comparator<Task> {
//
//		Property basis;
//		
//		public BasisComparator(Property basis) {
//			this.basis = basis;
//		}
//		
//		@Override
//		public int compare(Task t1, Task t2) {
//			double v1 = ((NumericValue) t1.getSingleValue(basis)).getValue();
//			double v2 = ((NumericValue) t2.getSingleValue(basis)).getValue();
//			if (v1 < v2) return -1;
//			else if (v1 > v2) return 1;
//			else return 0;
//		}
//		
//	}
	
	public static RegressionModelType predict(double[] x, double[] y) {
		if (x.length != y.length) {
			throw new RuntimeException("Invalid length of input and output arrays");
		}
		// order tasks by property
//		Task[] tasks = new Task[cluster.getTasks().size()];
//		cluster.getTasks().toArray(tasks);
//		Arrays.sort(tasks, new BasisComparator(basis));
		
		Double prevT = null;
		
		// predict
		for (int i = 0; i < (y.length - 1); i++) {
			double x1 = x[i];
			double x2 = x[i + 1];
			if (x1 == x2) {
				continue;
			}
			double y1 = y[i];
			double y2 = y[i + 1];
			double t = Math.atan((y2 - y1) / (x2 - x1));
			if (prevT == null) {
				prevT = t;
			} else {
				if (t > 0 && prevT > 0) { // t > 0, увеличение значения
					if (prevT > t * 1.05) { // log
						return RegressionModelType.LOGARITHMIC;
					} else if (prevT < t * 0.95) { // polynom
						return RegressionModelType.POLYNOMIAL;
					} else {
						return RegressionModelType.LINEAR;
					}
				} else if (t < 0 && prevT < 0) { // t < 0, уменьшение значения
					if (prevT < t * 1.05) { // reverse
						return RegressionModelType.REVERSE;
					} else if (prevT > t * 0.95) { // can't be
						return RegressionModelType.UNKNOWN;
					} else {
						return RegressionModelType.REVERSE;
					}
				}
			}
		}
		
		return RegressionModelType.UNKNOWN;
	}
	
}
